-- ChargeM
-- Created by panyl Jan/27/2015
-- 充值模块

module("ChargeM", package.seeall);

-- 是否在等待服务器到账
local waiting = false;

local rechargeVerify = {};
local lastRechargeInfo = {};
local schedulerId;

-- 到账时间差
local ENTER_ACOUNT_TIME_DIFF = 3;

-- 充值交易是否完成
local transFinished = false;

-- 最近一次充值订单号（目前只有GooglePlay和AppStore有用到）
local lastOrderId;

-- 内部函数声明
local onRechargeTransFinish;

-- 模块初始化
function init()
    waiting = false;
    transFinished = false;
    lastOrderId = nil;

    -- 对账记录
    rechargeVerify = {};

    EventMgr.removeAll("ChargeM");

    -- 关注充值交易完成的事件
    EventMgr.register("ChargeM", event.RECHARGE_TRANS_FINISH, onRechargeTransFinish);
end

function rechargeHandle(sku, orderId)
    if schedulerId then
        return;
    end

    -- 目前充值可能存在如下情况：
    -- 当收到SDK层抛出的扣款成功的事件时，服务器已经通知到账了
    -- 显然这时候不应该再弹出等待到账的界面
    -- 为了避免误弹提示框，下面需要判断一下，如果最近几秒内服务器已经通知到账，则不处理
    -- 暂定这个到账的时间差为3秒，如果玩家在3秒内发起了两笔充值，顶多表现为第二笔充值不弹等待中界面
    if sku == lastRechargeInfo["sku"] then
        local curTime = TimeM.getServerTime();
        local lastTime = lastRechargeInfo["rechargeTime"] or 0;
        if curTime - lastTime < ENTER_ACOUNT_TIME_DIFF then
            trace("ChargeM", "服务器已经通知(%s)到账。", sku);
            return;
        end
    end

    lastOrderId = orderId;
    waiting = true;

    -- 如果与服务器的连接已经断开，则重连一下，确保后续能正常收到服务器的到账通知
    if not Socket.isConnected() then
        trace("ChargeM", "与服务器的连接已断开，尝试重连。");
        LoginM.quiteReconnect();
    end

    local function fireEvent()
        -- 删除定时器
        ScheduleM.deleteScheme("ChargeM");

        -- 抛出充值事件
        EventMgr.fire(event.RECHARGE_OK, {["sku"] = sku,});
    end

    -- TODO SLIMEC-2895 临时方案： 稍微延迟一下，解决崩溃问题
    -- ！！！！！！！！！！！！
    ScheduleM.createScheme("ChargeM", fireEvent, 0.3, true)
end

-- 获取等待账单数量
function isWaitingRecharge()
    return waiting;
end

function notifyRechargeResult(goodsId, detailId, ptExtraPara)
    trace("ChargeM", "notifyRechargeResult: goodsId = %s, detailId = %s", tostring(goodsId), tostring(detailId));

    -- 先给服务器一个回应
    Communicate.send("CMD_RESPONSE_CHARGE_RESULT", {["detail_id"] = detailId, });

    -- 取消等待
    waiting = false;

    -- 如果之前已经到过了
    if rechargeVerify[detailId] then
        return;
    end

    -- 标记已经到账了
    rechargeVerify[detailId] = goodsId;

    local sku = MarketM.querySku(goodsId);
    local serverTime = TimeM.getServerTime();

    -- 记录最近一次到账信息
    lastRechargeInfo = {
        ["sku"]           = sku,
        ["rechargeTime"]  = serverTime,
    };

    -- 计算充值可获得的钻石数量
    local gem = MarketM.calcChargeGem(goodsId);

    -- 通知客户端购买（由于是服务器通知下来的，因此需要无条件购买）
    local ret = MarketM.buyGoods(goodsId, true, nil, ptExtraPara);

    -- 这里不可能买失败
    assert(type(ret) == "table", "这里不应该够买失败！");

    local bonus = ret.bonus;
    local compensateGem = ret.compensateGem;

    -- 抛出事件
    EventMgr.fire(event.RECHARGE_RESULT, {
        ["goodsId"] = goodsId,
        ["bonus"]   = bonus,
        ["compensateGem"] = compensateGem,
    });

    -- 发送服务器充值到账的通知
    if isAndroidPlatform() or isIosPlatform() then
        local serverTime = os.date("%Y-%m-%d %H:%M:%S", serverTime);
        SdkMgr.onServerRechargeOk(sku, serverTime, gem);
    end
end

-- 充值交易完成的回调（此时已完成扣款，并且已将订单写入pdb数据库，客户端需要等待服务器通知到账）
function onRechargeTransFinish(args)
    trace("ChargeM", "Transaction finish.");
    transFinished = true;
end

-- 充值交易是否完成
function hasTransFinished()
    return transFinished;
end

-- 重置充值交易
function resetTransation()
    trace("ChargeM", "Transaction reset.");
    transFinished = false;
end

-- 获取最近一次充值订单号（目前只有google平台有）
function getLastOrderId()
    return lastOrderId;
end

-- 是否是网页第三方充值
function isWeb3rdCharge(payChannel)
    return FormulaM.invoke("IS_WEB_3RD_CHARGE", payChannel);
end


